\documentclass{scrreprt}
\usepackage{xeCJK}
\pagenumbering{gobble}
\usepackage{listings}
\usepackage{underscore}
\usepackage{graphicx}
\usepackage{float}
\usepackage{multirow}
\usepackage[bookmarks=true]{hyperref}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\hypersetup{
    bookmarks=false,    % show bookmarks bar?
    pdftitle={概要设计文档},    % title
    pdfauthor={张权 何朋蒸},                     % author
    pdfsubject={概要设计},                        % subject of the document
    pdfkeywords={概要 总体 设计}, % list of keywords
    colorlinks=true,       % false: boxed links; true: colored links
    linkcolor=blue,       % color of internal links
    citecolor=black,       % color of links to bibliography
    filecolor=black,        % color of file links
    urlcolor=purple,        % color of external links
    linktoc=page            % only page is linked
}%
\def\myversion{1.0 }
\date{}
%\title{%

%}
\usepackage{hyperref}
\begin{document}

\begin{flushright}
    \rule{16cm}{5pt}\vskip1cm
    \begin{bfseries}
        \Huge{PRELIMINARY DESIGN\\DOCUMENT}\\
        \vspace{1.9cm}
        for\\
        \vspace{1.9cm}
        Course Registration System\\
        \vspace{1.9cm}
        \LARGE{Version \myversion approved}\\
        \vspace{1.9cm}
        Prepared by 张权\quad 何朋蒸\\
        \vspace{1.9cm}
        计算机科学与技术学院23班\\
        \vspace{1.9cm}
        \today\\
    \end{bfseries}
\end{flushright}

\tableofcontents


\chapter*{Revision History}

\begin{center}
	\begin{tabular}{|c|c|c|}
		\hline
		Revision & Date & Changes\\
		\hline
		Revision1 & May 27, 2020 & \\
		\hline
	\end{tabular}
\end{center}
\cleardoublepage% ensures that the page numbering will change on a recto page
\pagenumbering{arabic}


% -----------------------------------------------------------
% 引言
% -----------------------------------------------------------
\chapter{引言}

\section{编写目的}    % 阐明编写概要设计说明书的目的，指明读者对象

本系统的主要任务是实现学生选课、教师教授课程、管理员维护课程、教师、学生信息等功能，主要功能如下:
\begin{enumerate}
	\item \textbf{学生选课}
	
	学生可以从当前可选课程中选择要学习的课程
	\item \textbf{学生获取成绩单}
	
	在学期末，学生可以获得当前学期的成绩汇总以及需要缴纳的学费。
	\item \textbf{教师选择教授的课程}
	
	教师可以从当前可选课程中选择要教授的课程
	\item \textbf{教师登记成绩}
	
	教师可以为授课班级的学生登记成绩。
	\item \textbf{管理员维护教师信息}
	
	管理员可以对教师信息进行增删改查。
	\item \textbf{管理员维护学生信息}
	
	管理员可以对学生信息进行增删改查。
	\item \textbf{管理员关闭学期注册}
	
	管理员可以关闭注册系统，关闭注册系统后，学生无法选课，教师无法选课，计费系统开始统计。
\end{enumerate}


\section{项目背景}    % 项目的委托单位，开发单位和主管部门；该软件系统与其他系统的关系

作为威利学院信息系统的负责人，我们的任务是开发一个新的学生注册系统。 学院希望有一个新的客户端服务器系统来取代现有的围绕主机技术开发的旧系统。新系统将能够允许学生选课，并通过接入校园局域网的个人计算机查看成绩单。教授将能够访问该系统选择教授课程以及记录成绩。

由于资金的减少，学院不能取代整个系统。学院将保留现有的课程目录数据库，所有课程信息都被维护。此数据库是运行在DECVAX上的Ingres关系数据库。幸运的是，学院投资了一个开放的SQL接口，允许从学院的Unix服务器访问这个数据库。遗留系统的性能相当差，因此新系统必须确保能够高校地访问遗留系统上的数据。系统将从遗留数据库访问课程信息，但不会更新数据。管理部门将继续通过另一个系统维护课程信息。

在每个学期开始时，学生可以获取一个课程目录，其中包含一个学期的可选课程清单。将包括关于每门课程的信息，如授课老师、院系和先修课程，以帮助学生做出正确的决定。

新系统将允许学生为下学期选择四门课程。 此外，每个学生将选出两个备选课程，以防学生不能被分配到首要选择。 一个课程最多有10名学生上课，最少有3名学生。选课人数不到3人的课程将被取消。对于每个学期，有一段时间学生可以选课。 学生必须能够在此期间访问系统以添加或删除课程。 一旦学生的选课过程完成，注册系统将信息发送到计费系统，以便学生可以为学期计费。 如果一门课程在实际注册过程中填写，则在提交处理时间表之前，必须通知学生更改。

学期末，学生将能够通过系统查看电子成绩单.由于学生成绩是敏感信息，系统必须采取额外的安全措施，以防止未经授权的访问。

教授必须能够访问在线系统，以指示他们将教授哪些课程。 他们还需要看看哪些学生报名参加了他们的课程。 此外，教授将能够记录每个班级学生的成绩。




\section{定义}    % 列出文档中用到的专门术语定义和缩写词的原意
\paragraph{课程}
大学提供的一门课。
\paragraph{课程提供}
一个特定学期的课程的具体交付，你可以在学期中同时开展相同的课程。不限制每周的天数和次数。
\paragraph{课程目录}
大学提供的所有课程的目录
\paragraph{全体教师}
大学的所有授课老师。
\paragraph{财务系统}
用于处理计费信息的系统。
\paragraph{分数}
对特定学生进行特定课程的评分。
\paragraph{教授}
在大学任教的人。
\paragraph{成绩单}
一个学生在某一学期所修所有课程的所有成绩。
\paragraph{名册}
所有参加特定课程的学生。
\paragraph{学生}
在大学上课的人。
\paragraph{时间表}
学生选择的本学期的课程。
\paragraph{成绩单}
所有课程的历史成绩，上报财务系统并返还学生账单。

\section{参考资料}    % 列出这些资料的作者、标题、编号、发表日期、出版单位或资料来源，包括项目经核准的计划任务书，合同或上机机关的批文；项目开发计划；需求规格说明书；测试计划(初稿)；用户操作手册(初稿)；文档所引用的资料、采用的标准或规范
\begin{itemize}
	\item 概要设计说明书\footnote{https://wiki.mbalib.com/wiki/概要设计说明书}
	\item 概要设计说明书\footnote{https://www.bookstack.cn/read/DocumentTemplate/Architectural-Design-Specification.md}
\end{itemize}

% -----------------------------------------------------------
% 任务概述
% -----------------------------------------------------------

\chapter{任务概述}

\section{目标}
在满足设计要求的前提下,尽可能地提升系统的运行效率，简化系统的功能操作。
\section{运行环境}
Windows 10 $\&$ Ubuntu Desktop 18.04等操作系统中的Google Chrome和Mozilla Firefox浏览器
\section{需求概述}
\paragraph{项目主题}开发一个学生选课管理系统
\paragraph{主要功能}学生可在该系统上进行课程退补选、成绩信息查询等；教师可在该系统上进行课程注册、查看课程学生名单、录入学生成绩等；管理员可进行进行学生和教师的信息维护、管理计费系统等。
\paragraph{性能要求}对数据库上的数据必须进行及时正确的刷新。
\paragraph{输出要求}简洁，快速，实时，相关信息正确、完整、详实。

\section{条件与限制}
\begin{enumerate}
	\item 功能性
	
	多个用户必须能够同时执行他们的工作。
	如果一门课程在学生制定包括课程在内的时间表时已满，则必须通知学生。
	\item 可用性
	
	用户界面应符合Windows 10 $\&$ Ubuntu Desktop 18.04等操作系统中的Google Chrome和Mozilla Firefox浏览器。
	\item 可靠性
	
	系统应每周7天，每天24小时可用，停机时间不超过10%..
	\item 效率
	
	该系统应在任何特定时间支持多达2000个同时使用中央数据库的用户，并在任何时间支持多达500个同时使用本地服务器的用户。系统应提供对遗留课程目录数据库的访问，延迟不超过10秒。
	
	\textbf{注：基于风险的原型发现，如果没有对中间层处理能力的一些创造性使用，遗留课程目录数据库就无法满足我们的性能需求，系统必须能在2分钟内完成80\%的所有事务}
	
	\item 可支持性
	
	无。
	\item 安全
	
	该系统必须防止学生改变他们自己以外的任何时间表，以及教授修改为其他教授指定的课程。
	只有教授才能为学生输入成绩；
	只允许管理员更改任何学生信息。
	
\end{enumerate}

% -----------------------------------------------------------
% 总体设计
% -----------------------------------------------------------

\chapter{总体设计}

\section{需求规定}    % 说明对本系统的主要的输入输出项目、处理的功能性能要求
课程注册系统面向三种不同用户对象，分别是学生，老师和管理员。系统提供登录接口，使三种用户均通过用户名和密码登录，并自动确定用户角色，分别为三种不同的用户提供各自的接口。对三种用户，系统接受其相应的请求或填写的表单数据，获取数据后返回到后端，后端处理用户数据和请求，并将结果返回到前端，并提供相应的页面变化或跳转。当不能满足用户请求时，系统需要返回相应的提示信息，以提醒用户。

\section{运行环境}
系统能运行在当前主流电脑操作系统中，至少包括Microsoft Windows10, Mac OS和主流Linux桌面发行版。

\section{总体结构和模块外部设计}
总体结构分为三大部分：数据模块，操作模块以及表示模块。

数据模块用于存储系统运行需要处理的数据，数据之间的关系，数据的访问权限以及使用数据的接口；操作模块维护用户各个界面及其各自的功能，并接受前端用户请求，从数据模块提取数据加以处理，及时更新数据模块的数据，并将处理结果送到前端用于展示。表示模块接受用户请求，提供必要的表单给用户，并将用户的请求和表单数据返回到操作模块进行处理，并将操作模块处理后的结果展示给用户。


\section{功能分配}    % 表明各项功能与程序结构的关系
\subsection{学生部分}
对于学生，系统提供如下功能：
\begin{itemize}
	\item 登录。学生用户通过学号和密码填写表单，申请登录。系统查询数据，若学号和密码验证成功，则用户进入学生的主页。
	
	\item 管理课程。在学生主页提供学生选课接口，学生点击进入之后，可实行选课，退选课程，将课程设为备选，将某课程移除备选功能。每一个功能对应一个处理函数。
	
	\item 查看成绩单。在学生主页提供学生查看成绩单的接口，学生点击进入之后，便可查看已有成绩的课程信息以及对应的成绩。
	
	\item 查看消息。在学生主页提供学生查看消息的接口，学生点击进入之后，便可查看已读消息和未读消息。学生可以选择将所有未读消息标记为已读。查看消息和标记为已读分别对应一个函数处理。
	
	\item 账单系统。在学生主页提供账单系统接口，学生点击进入之后，便可查看自己的账户余额，需要付款的金额。若学生有需要付款的金额，则系统提供接口使学生能够完成支付。系统同时提供充值接口，学生进入充值页面完成充值。每个子功能对应一个函数处理。
	
	\item 退出登录。在学生主页提供退出登录功能，使学生能够退出用户登陆状态。
\end{itemize}
在学生登录之前，只提供登录接口；当学生登录成功之后，学生可随时点击管理课程，查看成绩单，查看消息，账单系统和退出登录接口。

\subsection{教师部分}
对于教师，系统提供如下功能：
\begin{itemize}
	\item 登录。教师用户通过教师号和密码填写表单，申请登录。系统查询数据，若教师号和密码验证成功，则用户进入教师的主页。
	
	\item 管理课程。在教师主页提供教师选课接口，教师点击进入之后，可实行选课，退选课程功能。每一个功能对应一个处理函数。
	
	\item 查看消息。在教师主页提供教师查看消息的接口，教师点击进入之后，便可查看已读消息和未读消息。教师可以选择将所有未读消息标记为已读。查看消息和标记为已读分别对应一个函数处理。
	
	\item 录入成绩。在教师主页提供教师录入成绩的接口，教师点击进入之后，便可查看自己教授的课程。对于每一门自己教授的课程，教师可以选择查看所有选了这门课程的学生，并为其录入成绩。
	
	\item 退出登录。在教师主页提供退出登录功能，使教师能够退出用户登陆状态。
\end{itemize}
在教师登录之前，只提供登录接口；当教师登录成功之后，教师可随时点击管理课程，查看消息，录入成绩和退出登录接口。



\subsection{管理员部分}
对于管理员，系统提供如下功能：
\begin{itemize}
	\item 登录。管理员用户通过管理员号和密码填写表单，申请登录。系统查询数据，若管理员号和密码验证成功，则用户进入管理员的主页。
	
	\item 管理教师信息。在管理员主页提供管理教师信息接口，管理员点击进入之后，可实行添加教师，修改教师信息，查询教师信息，删除教师功能。每一个功能对应一个处理函数。
	
	\item 管理学生信息。在管理员主页提供管理学生信息接口，管理员点击进入之后，可实行添加学生，修改学生信息，查询学生信息，删除学生功能。每一个功能对应一个处理函数。
	
	\item 取消课程。在管理员主页提供取消课程的接口，管理员点击进入之后，系统列出不满足开课条件的课程。对于每一门不满足开课条件的课程管理员可以选择取消这门课程。
	
	\item 退出登录。在管理员主页提供退出登录功能，使管理员能够退出用户登陆状态。
\end{itemize}
在管理员登录之前，只提供登录接口；当管理员登录成功之后，管理员可随时点击管理教师信息，管理学生信息，取消课程和退出登录接口。


\section{人工处理过程}    % 说明在本软件系统的工作过程中不得不包含的人工处理过程(如果有的话)
在系统首次运行之前需要人工整理好初始数据，并将数据录入数据库，使得系统可以开始运行。



% -----------------------------------------------------------
% 接口设计
% -----------------------------------------------------------
\chapter{接口设计}
接口设计主要包括用户接口、外部接口和内部接口三个部分。
\section{用户接口}    % 说明将向用户提供的命令和它们的语法结构，以及软件的回答信息
用户，即客户端，通过网络浏览器，如Google Chrome, Mozilla Firefox等，在地址栏填入相应的IP地址即可进入系统。服务器和客户端浏览器通过超文本传输协议传送超文本文件。超文本文件即为用户所看到的界面，为用户提供操作接口。用户点击功能按钮即可发送HTTP请求到服务器，进而执行相应的操作。
\section{外部接口}    % 说明本系统同外界的所有接口的安排包括软件与硬件之间的接口、本系统与各支持软件之间的接口关系
系统采用Python语言编写，并不直接与硬件交互，系统通过Python解释器转化为相应的机器码运行。
\section{内部接口}    % 说明本系统之内的各个系统元素之间的接口的安排
本系统后端采用Python语言，在Flask框架下构建。Flask框架提供了诸如路由构建，用户登录状态，表单，重定向，生成动态HTML文件，视图函数之间以及视图函数与HTML文件之间数据传送的接口。数据库的构建与访问采用SQLALCHEMY类库提供的接口。在前端采用jinja2来控制和访问数据。

前端采用jinja2提供的接口控制HTML页面和后端提供的数据，jinja2也提供了重定向接口。HTML和CSS、Bootstrap以及Javascript可以自然地配合使用，以控制页面。



% -----------------------------------------------------------
% 数据结构设计
% -----------------------------------------------------------

\chapter{数据结构设计}
本系统最主要的数据就是存储各类用户信息、课程等相关数据以及数据之间的关系。
\section{逻辑结构设计要点}
% 给出本系统内所使用的每个数据结构的名称、标识符以及它们之中每个数据项、记录、文卷和系的标识、定义、长度及它们之间的层次的或表格的相互关系

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig1.png}
	\caption{教授}
\end{figure}

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig2.png}
	\caption{学生}
\end{figure}

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig3.png}
	\caption{管理员}
\end{figure}

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig4.png}
	\caption{课程}
\end{figure}
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig5.png}
	\caption{账单}
\end{figure}
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig6.png}
	\caption{课程段}
\end{figure}
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig7.png}
	\caption{消息箱}
\end{figure}

\section{物理结构设计要点}
% 给出本系统内所使用的每个数据结构中的每个数据项的存储要求，访问方法、存取单位、存取的物理关系（索引、设备、存储区域）、设计考虑和保密条件
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig8.png}
	\caption{教授}
\end{figure}

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig9.png}
	\caption{学生}
\end{figure}

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig10.png}
	\caption{管理员}
\end{figure}

\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig11.png}
	\caption{课程}
\end{figure}
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig12.png}
	\caption{账单}
\end{figure}
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig13.png}
	\caption{课程段}
\end{figure}
\begin{figure}[H]
	\centering
	\includegraphics[scale=0.8]{figures/fig14.png}
	\caption{消息箱}
\end{figure}

\section{数据结构与程序的关系}    % 说明各个数据结构与访问这些数据结构的形式
本系统的数据存储采用数据库实现，通过flask\_sqlalchemy的模块功能调用来实现对数据库的增删改查操作。
\begin{enumerate}
	\item 添加数据：
	
	db.session.add(student)
	db.session.commit()
	\item 删除数据
	
	db.session.delete(student)
	db.session.commit()
	\item 修改数据

	student=Student.query.filter(Student.student_id==student_id).first()
	student.name="张三"
	db.session.commit()

	\item 查询数据
	student=Student.query.filter(Student.student_id==student_id).first()
	
\end{enumerate}





%% -----------------------------------------------------------
%% 运行设计
%% -----------------------------------------------------------
%\chapter{运行设计}
%
%\section{运行模块的组合}
%
%\section{运行控制}
%
%\section{运行时间}

% -----------------------------------------------------------
% 出错处理设计
% -----------------------------------------------------------

\chapter{出错处理设计}

\section{出错信息}    
% 用一览表的方式说朗每种可能的出错或故障情况出现时，系统输出信息的形式、含意及处理方法
\begin{table}[H]
	\centering
	\resizebox{\columnwidth}{!}{
	\begin{tabular}{|c|c|c|c|}
		\hline
		情形                                                                         & 输出信息                                                                                       & 处理方式                                                                               & 备注                                                                         \\ \hline
		登录时用户名和密码匹配错误                                                              & "用户名和密码错误"                                                                                 & \multirow{20}{*}{\begin{tabular}[c]{@{}c@{}}系统跳出提示信息告知用户，\\ 并停留在当前页面\end{tabular}} & \multirow{2}{*}{}                                                          \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}学生选课时因课程\\ 容量已满，选课失败\end{tabular}               & "课程容量已满！选课失败！"                                                                             &                                                                                    &                                                                            \\ \cline{1-2} \cline{4-4} 
		\begin{tabular}[c]{@{}c@{}}学生删除课程时可能\\ 出现要删除的课程不存在\end{tabular}            & "要删除的课不存在！"                                                                                &                                                                                    & \begin{tabular}[c]{@{}c@{}}这是后台的防护措施，\\ 数据库安全的正常情况下，\\ 不会出现此条\end{tabular} \\ \cline{1-2} \cline{4-4} 
		\begin{tabular}[c]{@{}c@{}}学生充值时输入的\\ 金额小于或等于0\end{tabular}                & "请输入大于零的金额值"                                                                               &                                                                                    & \multirow{17}{*}{}                                                         \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}学生充值时输入的金额\\ 小数点后多余两位数字\end{tabular}            & \begin{tabular}[c]{@{}c@{}}"金额值小数点后最多两位数字！\\ 请重新输入！"\end{tabular}                          &                                                                                    &                                                                            \\ \cline{1-2}
		学生支付时账户余额不足已完成支付                                                           & "当前余额不足，请充值！"                                                                              &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}教师选择要教的课程时\\ 课程已被其他教师所选\end{tabular}            & "选课失败，该课程已被其他老师所选！"                                                                        &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}教师在给某个学生提交成绩时，\\ 所提交的成绩非成绩系统正常成绩格式\end{tabular} & \begin{tabular}[c]{@{}c@{}}"成绩应为"A","B","C","D","F"和"I"六个\\ 等级中的一个！请输入正确的成绩！"\end{tabular} &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员添加学生时，\\ 所输入的学号格式不正确\end{tabular}            & \begin{tabular}[c]{@{}c@{}}"学号必须以数字2开头，\\ 请确认后重新添加！"\end{tabular}                          &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员添加学生时，\\ 所输入的学号系统已存在\end{tabular}            & \begin{tabular}[c]{@{}c@{}}"系统已存在该学生！\\ 请检查学号是否输入正确！"\end{tabular}                         &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员添加学生时，\\ 所输入的初始余额为负数\end{tabular}            & "请输入非负的初始余额！"                                                                              &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员删除学生时，\\ 系统不存在要删除的学生\end{tabular}            & "系统不存在该学生"                                                                                 &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员更新学生信息时，\\ 系统不存在该学生\end{tabular}             & "系统不存在该学生"                                                                                 &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员添加教师时，\\ 所输入的教师工号格式不正确\end{tabular}          & \begin{tabular}[c]{@{}c@{}}"教师工号必须以数字5开头，\\ 请确认后重新添加！"\end{tabular}                        &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员添加教师时，\\ 所输入的教师工号系统已存在\end{tabular}          & \begin{tabular}[c]{@{}c@{}}"系统已存在该教师！\\ 请检查教师工号输入是否正确！"\end{tabular}                       &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员添加学生时，\\ 所输入的初始余额为负数\end{tabular}            & "请输入非负的初始余额！"                                                                              &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员删除教师时，\\ 系统不存在要删除的教师\end{tabular}            & "系统不存在该教师"                                                                                 &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员更新教师信息时，\\ 系统不存在该教师\end{tabular}             & "系统不存在该教师"                                                                                 &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员查询学生时，\\ 系统不存在该学生\end{tabular}               & "查询失败！系统不存在该学生"                                                                            &                                                                                    &                                                                            \\ \cline{1-2}
		\begin{tabular}[c]{@{}c@{}}管理员查询教师时，\\ 系统不存在该教师\end{tabular}               & "查询失败！系统不存在该教师"                                                                            &                                                                                    &                                                                            \\ \hline
		\begin{tabular}[c]{@{}c@{}}在各种表单填写时不符合表单\\ 对数据类型与长度的要求\end{tabular}        & 因具体情况不同                                                                                    & \begin{tabular}[c]{@{}c@{}}表单直接显示错误提示信息，\\ 并要求正确填写\end{tabular}                    & 这部分在表单中具体情况具体处理                                                            \\ \hline
	\end{tabular}
	}
	\caption{错误处理一览表}
\end{table}


\section{补救措施}   
%说明故障出现后可能采取的变通措施，包括：
%
%后备技术说明准备采用的后备技术，当原始系统数据万一丢失时启用的副本的建立和启动的技术，例如周期性地把磁盘信息记录到磁带上去就是对于磁盘媒体的一种后备技术；
%降效技术说明准备采用的后备技术，使用另一个效率稍低的系统或方法来求得所需结果的某些部分，例如一个自动系统的降效技术可以是手工操作和数据的人工记录；
%恢复及再启动技术说明将使用的恢复再启动技术，使软件从故障点恢复执行或使软件从头开始重新运行的方法
可采用定时备份数据库的方式保证数据库安全，并对程序定期做维护，已检查程序是否有问题。



% -----------------------------------------------------------
% 安全保密设计
% -----------------------------------------------------------

\chapter{安全设计}
安全设计主要分为用户数据安全，数据库安全和线程安全三部分。
\section{用户数据安全}
系统要保证用户密码不被泄露。为了达到这一目的，用户密码在数据库中不能明文存储，而是采用密码hash值来代替。为此需要两个函数来完成这个目标：
\begin{itemize}
	\item generate\_password\_hash(password): 接受一个普通密码产生密码的hash值；
	\item check\_password\_hash(password\_hash, password): 将普通密码与用户密码的hash值做校验，检查是或否密码正确，从而验证身份。
\end{itemize}
除此之外，对这两个函数还要求
\begin{enumerate}
	\item 对与同一个用户，当check\_password\_hash(password\_hash, password)函数接受的密码为正确密码时，函数总是返回True；对于错误的密码，函数总是返回False。结果只根据密码正确与否有关，不随其他因素而改变。
	
	\item 对于不同用户，即使用户密码相同，但generate\_password\_hash(password)生成的hash值应不同。
\end{enumerate}
这两个函数均有Flask框架提供。
\section{数据库安全}
数据库中的信息应当具有一致性，这要求对数据库中的公共信息的修改等操作需要具有原子性。除此之外，在更新数据库信息之后需要及时对数据库进行commit操作。当数据库中某写信息修改之后，相关的信息需要做相应的更新或删除等处理。

\section{线程安全}
访问系统中共享数据信息时，不同线程应保持线程安全，否则会造成系统数据不一致等严重问题。Flask提供了内部的线程并发支持，在编写程序时，不必再显式进行并发操作。在新版本的Flask中，app.run()方法中的threaded参数默认为True。




% -----------------------------------------------------------
% 维护设计
% -----------------------------------------------------------

\chapter{维护设计} %说明为了系统维护的方便而在程序内部设计中作出的安排，包括在程序中专门安排用于系统的检查与维护的检测点和专用模块。 各个程序之间的对应关系，可采用如下的矩阵图的形式
为方便维护，程序将三种用户分成三个单独的模块，其后端处理程序，前端模板文件分开保存，将这三部分完全分离。这样有利于程序的独立维护，使得某一模块出现问题不会影响到其他的模块。除此之外，系统主界面和登录登出处理分开处理，目的同样是将其模块化处理，减少模块之间的相互影响。模块之间除必要的接口外，并无互相影响。

系统还提供了管理人员维护数据库的接口(注意此处提到的管理员是指程序的维护人员，并非用户中的管理员角色)，即在shell环境中直接处理数据库，以便管理人员有办法人工处理重大的数据库问题。\textbf{需要注意的是，这种手段具有极高的风险性，如果操作不当可能会损害数据库中的数据以及造成数据泄露，是不到万不得已不允许使用的手段。}
\end{document}
